home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / eeboot20.zip / EEBOOT20.ASM next >
Assembly Source File  |  1993-06-23  |  8KB  |  317 lines

  1. **********************************************************************
  2. *
  3. * 6811 bootstrap loader with "intelligent" EEPROM burner
  4. * only erases bytes when they need to be!
  5. *
  6. *
  7. * (C) 1992 Fred Martin
  8. *        fredm@media.mit.edu
  9. *
  10. *
  11. * protocol:
  12. *
  13. *  command  cmd-char    addr-hi addr-lo data-hi data-lo || return
  14. * ------------------------------------------------------++----------------
  15. *
  16. * READ BYTE    r    XX    XX    --    --    || <the-byte>
  17. *
  18. * WRITE BYTE    w    XX    XX    --    XX    || <the-byte>
  19. *
  20. * WRITE_BYTES    W    XX    XX     count-hi count-lo byte-1 ... byte-N
  21. *                            || <each byte echoed>
  22. *
  23. * WR_EEPROM_BYTES p    XX    XX    --    XX    || <the-byte>
  24. *
  25. * WR_EEPROM_BYTES P    XX    XX     count-hi count-lo byte-1 ... byte-N
  26. *                            || <each byte echoed>
  27. *
  28. * BULK_ERASE    B    --    --    --     CONFIG    || <B>
  29. *
  30. * SYNCRONIZE    s    --    --    --    --    || prompt
  31. *
  32. *
  33. * prompt character: ">" sent when ready for a command
  34. *
  35.  
  36. * file of standard 6811 register declarations
  37.  
  38. *********************************************************************
  39. * Control Registers
  40.  
  41. BASE    EQU    $1000
  42.  
  43. PORTA    EQU    $1000    ; Port A data register
  44. RESV1    EQU    $1001    ; Reserved
  45. PIOC    EQU    $1002    ; Parallel I/O Control register
  46. PORTC    EQU    $1003    ; Port C latched data register
  47. PORTB    EQU    $1004    ; Port B data register
  48. PORTCL    EQU    $1005    ;
  49. DDRC    EQU    $1007    ; Data Direction register for port C
  50. PORTD   EQU     $1008    ; Port D data register
  51. DDRD    EQU     $1009    ; Data Direction register for port D
  52. PORTE    EQU    $100A    ; Port E data register
  53. CFORC    EQU    $100B    ; Timer Compare Force Register
  54. OC1M    EQU    $100C    ; Output Compare 1 Mask register
  55. OC1D    EQU    $100D    ; Output Compare 1 Data register
  56.  
  57. * Two-Byte Registers (High,Low -- Use Load & Store Double to access)
  58. TCNT    EQU    $100E    ; Timer Count Register
  59. TIC1    EQU    $1010    ; Timer Input Capture register 1
  60. TIC2    EQU    $1012    ; Timer Input Capture register 2
  61. TIC3    EQU    $1014    ; Timer Input Capture register 3
  62. TOC1    EQU    $1016    ; Timer Output Compare register 1
  63. TOC2    EQU    $1018    ; Timer Output Compare register 2
  64. TOC3    EQU    $101A    ; Timer Output Compare register 3
  65. TOC4    EQU    $101C    ; Timer Output Compare register 4
  66. TI4O5    EQU    $101E    ; Timer Input compare 4 or Output compare 5 register
  67.  
  68. TCTL1    EQU    $1020    ; Timer Control register 1
  69. TCTL2    EQU    $1021    ; Timer Control register 2
  70. TMSK1    EQU    $1022    ; main Timer interrupt Mask register 1
  71. TFLG1    EQU    $1023    ; main Timer interrupt Flag register 1
  72. TMSK2    EQU    $1024    ; misc Timer interrupt Mask register 2
  73. TFLG2    EQU    $1025    ; misc Timer interrupt Flag register 2
  74. PACTL    EQU    $1026    ; Pulse Accumulator Control register
  75. PACNT    EQU    $1027    ; Pulse Accumulator Count register
  76. SPCR    EQU    $1028    ; SPI Control Register
  77. SPSR    EQU    $1029    ; SPI Status Register
  78. SPDR    EQU    $102A    ; SPI Data Register
  79. BAUD    EQU    $102B    ; SCI Baud Rate Control Register
  80. SCCR1    EQU    $102C    ; SCI Control Register 1
  81. SCCR2    EQU    $102D    ; SCI Control Register 2
  82. SCSR    EQU     $102E    ; SCI Status Register
  83. SCDR    EQU     $102F    ; SCI Data Register
  84. ADCTL    EQU    $1030    ; A/D Control/status Register
  85. ADR1    EQU    $1031    ; A/D Result Register 1
  86. ADR2    EQU    $1032    ; A/D Result Register 2
  87. ADR3    EQU    $1033    ; A/D Result Register 3
  88. ADR4    EQU    $1034    ; A/D Result Register 4
  89. BPROT    EQU    $1035    ; Block Protect register
  90. RESV2    EQU    $1036    ; Reserved
  91. RESV3    EQU    $1037    ; Reserved
  92. RESV4    EQU    $1038    ; Reserved
  93. OPTION    EQU    $1039    ; system configuration Options
  94. COPRST    EQU    $103A    ; Arm/Reset COP timer circuitry
  95. PPROG    EQU    $103B    ; EEPROM Programming register
  96. HPRIO    EQU    $103C    ; Highest Priority Interrupt and misc.
  97. INIT    EQU    $103D    ; RAM and I/O Mapping Register
  98. TEST1    EQU    $103E    ; factory Test register
  99. CONFIG    EQU    $103F    ; Configuration Control Register
  100.  
  101.  
  102. * Interrupt Vector locations
  103.  
  104. SCIINT    EQU    $D6    ; SCI serial system
  105. SPIINT    EQU    $D8    ; SPI serial system
  106. PAIINT EQU    $DA    ; Pulse Accumulator Input Edge
  107. PAOVINT EQU    $DC    ; Pulse Accumulator Overflow
  108. TOINT    EQU    $DE    ; Timer Overflow
  109. TOC5INT    EQU    $E0    ; Timer Output Compare 5
  110. TOC4INT    EQU    $E2    ; Timer Output Compare 4
  111. TOC3INT    EQU    $E4    ; Timer Output Compare 3
  112. TOC2INT    EQU    $E6    ; Timer Output Compare 2
  113. TOC1INT    EQU    $E8    ; Timer Output Compare 1
  114. TIC3INT    EQU    $EA    ; Timer Input Capture 3
  115. TIC2INT    EQU    $EC    ; Timer Input Capture 2
  116. TIC1INT    EQU    $EE    ; Timer Input Capture 1
  117. RTIINT    EQU    $F0    ; Real Time Interrupt
  118. IRQINT    EQU    $F2    ; IRQ External Interrupt
  119. XIRQINT    EQU    $F4    ; XIRQ External Interrupt
  120. SWIINT    EQU    $F6    ; Software Interrupt
  121. BADOPINT EQU    $F8    ; Illegal Opcode Trap Interrupt
  122. NOCOPINT EQU    $FA    ; COP Failure (Reset)
  123. CMEINT    EQU    $FC    ; COP Clock Monitor Fail (Reset)
  124. RESETINT EQU    $FE    ; RESET Interrupt
  125.  
  126. * Masks for serial port
  127. PORTDWOM    EQU    $20
  128. BAUD1200    EQU    $B3
  129. BAUD9600    EQU    $B0
  130. TRENA        EQU    $0C    ; Transmit, Receive ENAble
  131. RDRF        EQU    $20    ; Receive Data Register Full
  132. TDRE        EQU    $80    ; Transmit Data Register Empty
  133.  
  134. **********************************************************************
  135. *
  136. * start of program
  137. *
  138.     ORG    $00
  139.  
  140.     LDS     #$FF    ; set stack to top of internal RAM
  141.  
  142.     CLRA
  143.     STAA    BPROT    ; unprotect the EEPROM
  144.  
  145. * initialize serial port
  146.     LDX    #$1000
  147.     BRCLR    SCSR,X TDRE *    ; wait until ready for new char
  148.  
  149.     BCLR    SPCR,X PORTDWOM ; turn off wired-or mode
  150.     LDAA    #BAUD9600
  151.     STAA    BAUD,X
  152.     LDAA    #TRENA
  153.     STAA    SCCR2,X
  154.  
  155. * main interaction loop
  156. mainloop
  157.     BSR    cmd_loop
  158.     BRA    mainloop
  159.  
  160. * block write to EEPROM
  161. bweeprom
  162.     CLR    mode
  163.     BRA    bw_loop
  164.  
  165. * block write to RAM
  166. bw_ram
  167.     LDAA    #1
  168.     STAA    mode
  169.  
  170. * download block of bytes
  171. * address in X, count in Y
  172. bw_loop
  173.     BSR    getbyte        ; get byte to download
  174.     TAB            ; put into B for write cmds
  175.     TST    mode        ; if zero, do EEPROM burn
  176.     BEQ    bw_ee
  177.     BSR    writcmd2    ; 2nd entry to RAM store routine
  178.     BRA    bw_cont
  179. bw_ee    PSHY
  180.     BSR    eewr_2        ; 2nd entry point to eewr_cmd routine
  181.     PULY
  182. bw_cont INX            ; increment addr ptr
  183.     DEY            ; decrement count
  184.     BNE    bw_loop
  185.     RTS
  186.  
  187. writ_cmd EQU *
  188.     XGDY
  189. writcmd2 STAB    0,X
  190. * fall through to read_cmd
  191.  
  192. read_cmd EQU *
  193.     LDAA    0,X
  194.     BRA    putbyte        ; transmit A reg and return
  195.  
  196. **********************************************************************
  197.  
  198. cmd_loop EQU *
  199.  
  200. * transmit prompt to begin
  201.     LDAA    #'>'
  202.     BSR    putbyte
  203.  
  204.     BSR    getbyte        ; get command byte into A
  205.     CMPA    #'s'        ; check for synch cmd
  206.     BEQ    cmd_loop
  207.  
  208. *    BSR    putbyte        ; echo command byte
  209.  
  210.     PSHA
  211.     BSR    getword
  212.     XGDX            ; X has addr ptr
  213.     BSR    getword
  214.     XGDY            ; Y has data or count
  215.     PULA
  216.  
  217.     CMPA    #'r'
  218.     BEQ    read_cmd    ; read a byte
  219.     CMPA    #'p'
  220.     BEQ    eewr_cmd    ; write a byte to EEPROM
  221.     CMPA    #'W'
  222.     BEQ    bw_ram        ; block write to RAM
  223.     CMPA    #'P'
  224.     BEQ    bweeprom    ; block write to EEPROM
  225.     CMPA    #'B'
  226.     BEQ    bulk_ers    ; bulk erase EEPROM
  227.     CMPA    #'w'
  228.     BEQ    writ_cmd
  229.  
  230. bad_cmd    LDAA    #'?'        ; send '?' for bad command
  231. * fall through to putbyte
  232. **********************************************************************
  233.  
  234. putbyte    PSHX
  235.     LDX    #$1000
  236.     BRCLR    SCSR,X TDRE *
  237.     STAA    SCDR,X
  238.     PULX
  239.     RTS
  240.  
  241. * return word in D (A= high, B=low)
  242. getword BSR    getbyte
  243.     PSHA
  244.     BSR    getbyte
  245.     TAB
  246.     PULA
  247.     RTS
  248.  
  249. * read a byte from serial port and return in acc A
  250. getbyte    PSHX
  251.     LDX    #$1000
  252.     BRCLR     SCSR,X RDRF *
  253.     LDAA    SCDR,X
  254.     PULX
  255.     RTS
  256.  
  257. BYTE_PGM    EQU    $02
  258. BYTE_ERA    EQU    $16
  259. BULK_ERA    EQU    $06
  260.  
  261. eewr_cmd EQU *
  262.     XGDY        ; B has byte value to be written
  263. eewr_2    CMPB    0,X    ; check if byte already has desired value
  264.     BEQ    read_cmd ; return if so
  265.  
  266.     LDAA    0,X    ; get current value
  267.     COMA        ; complement
  268.     STAB    temp
  269.     ANDA    temp    ; AND with desired value
  270.     BEQ    noerase    ; if zero, don't need to erase
  271.  
  272.     LDAA    #BYTE_ERA
  273.     BSR    eepr_cmd
  274.  
  275. noerase    LDAA    #BYTE_PGM
  276.     BSR    eepr_cmd
  277.     BRA    read_cmd    ; get value back from byte and return
  278.  
  279.  
  280. bulk_ers
  281. * bulk erase eeprom
  282.     LDAA    #BULK_ERA
  283.     STAA    PPROG
  284.     STAA    CONFIG
  285.     ORAA    #1
  286.     STAA    PPROG
  287.     PSHY
  288.     JSR    delay100
  289.     PULY
  290.     CLR    PPROG
  291. * program the config reg
  292.     XGDY            ; B has value for config (F5 for 'E2)
  293.     LDAA    #BYTE_PGM
  294.     LDX    #CONFIG
  295. * fall through to eepr_cmnd
  296.  
  297. * put command in A register, byte to be written in B
  298. * ptr to address in X
  299. eepr_cmd EQU *
  300.     STAA    PPROG
  301.     STAB    0,X
  302.     ORAA    #1
  303.     STAA    PPROG
  304.     BSR    delay10
  305.     CLR    PPROG
  306.     RTS
  307.  
  308. delay100 LDY    #28570
  309.     BRA    delaylp
  310. delay10    LDY    #2857
  311. delaylp    DEY
  312.     BNE    delaylp
  313.     RTS
  314.  
  315. * temporary storage
  316. mode    RMB    1    ; 0 = eeprom burn, 1 = ram download
  317. temp    RMB    1